home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / fpkpas92.zip / SRCRTL.ZIP / RTL / DOS / SET.INC < prev    next >
Text File  |  1997-07-01  |  4KB  |  137 lines

  1. {****************************************************************************
  2.  
  3.                  Copyright (c) 1994,95 by Florian Klämpfl
  4.  
  5.  ****************************************************************************}
  6.  
  7. { Includedatei mit Unterprogrammen zur Mengenbearbeitung }
  8. { diese sollten nie direkt aufgerufen werden,            }
  9. { die Aufrufe werden vom Compiler direkt erzeugt         }
  10.  
  11.   { fügt das Element b der Menge zu, auf die p zeigt }
  12.  
  13.   procedure do_set(p : pointer;b : byte);[public,alias: 'SET_SET_BYTE'];
  14.   
  15.     begin
  16.        asm
  17.           pushl %eax
  18.           movl 8(%ebp),%edi
  19.           movb 12(%ebp),%al
  20.           andl $0xf8,%eax
  21.           shrl $3,%eax
  22.           addl %eax,%edi
  23.           movb 12(%ebp),%al
  24.           andl $7,%eax
  25.       btsl %eax,(%edi)
  26.           popl %eax
  27.        end;
  28.     end;
  29.  
  30.   { testet, ob das Element b in der Menge p vorhanden ist }
  31.   { und setzt das Carryflag entsprechend                  }
  32.  
  33.   procedure do_in(p : pointer;b : byte);[public,alias: 'SET_IN_BYTE'];
  34.  
  35.     begin
  36.        asm
  37.           pushl %eax
  38.           movl 8(%ebp),%edi
  39.           movb 12(%ebp),%al
  40.           andl $0xf8,%eax
  41.           shrl $3,%eax
  42.           addl %eax,%edi
  43.           movb 12(%ebp),%al
  44.           andl $7,%eax
  45.       btl %eax,(%edi)
  46.           popl %eax
  47.        end;
  48.     end;
  49.  
  50.    { vereinigt set1 und set2 und speichert das Ergebnis in dest }
  51.  
  52.    procedure add_sets(set1,set2,dest : pointer);[public,alias: 'SET_ADD_SETS'];
  53.  
  54.      begin
  55.         asm
  56.            movl 8(%ebp),%esi
  57.            movl 12(%ebp),%ebx
  58.            movl 16(%ebp),%edi
  59.            movl $8,%ecx
  60.        LMADDSETS1:
  61.            lodsl
  62.            orl (%ebx),%eax
  63.            stosl
  64.            addl $4,%ebx
  65.            decl %ecx
  66.            jnz LMADDSETS1
  67.         end;
  68.      end;
  69.  
  70.    { bildet den Durchschnitt von set1 und set2 }
  71.    { und speichert das Ergebnis in dest        }
  72.  
  73.    procedure mul_sets(set1,set2,dest : pointer);[public,alias: 'SET_MUL_SETS'];
  74.  
  75.      begin
  76.         asm
  77.            movl 8(%ebp),%esi
  78.            movl 12(%ebp),%ebx
  79.            movl 16(%ebp),%edi
  80.            movl $8,%ecx
  81.        LMMULSETS1:
  82.            lodsl
  83.            andl (%ebx),%eax
  84.            stosl
  85.            addl $4,%ebx
  86.            decl %ecx
  87.            jnz LMMULSETS1
  88.         end;
  89.      end;
  90.  
  91.    { bildet die Differenz von set1 und set2 }
  92.    { und speichert das Ergebnis in dest     }
  93.  
  94.    procedure sub_sets(set1,set2,dest : pointer);[public,alias: 'SET_SUB_SETS'];
  95.  
  96.      begin
  97.         asm
  98.            movl 8(%ebp),%esi
  99.            movl 12(%ebp),%ebx
  100.            movl 16(%ebp),%edi
  101.            movl $8,%ecx
  102.        LMSUBSETS1:
  103.            lodsl
  104.            movl (%ebx),%edx
  105.            notl %edx
  106.            andl %edx,%eax
  107.            stosl
  108.            addl $4,%ebx
  109.            decl %ecx
  110.            jnz LMSUBSETS1
  111.         end;
  112.      end;
  113.  
  114.    { vergleicht Mengen und setzt die Flags entsprechend }
  115.  
  116.    procedure comp_sets(set1,set2 : pointer);[public,alias: 'SET_COMP_SETS'];
  117.  
  118.      begin
  119.         asm
  120.            movl 8(%ebp),%esi
  121.            movl 12(%ebp),%edi
  122.            movl $8,%ecx
  123.        LMCOMPSETS1:
  124.            lodsl
  125.            movl (%edi),%edx
  126.            cmpl %edx,%eax
  127.            jne  LMCOMPSETEND
  128.            addl $4,%edi
  129.            decl %ecx
  130.            jnz LMCOMPSETS1
  131.            // we are here only if the two sets are equal
  132.            // we have zero flag set, and that what is expected
  133.            cmpl %eax,%eax
  134.        LMCOMPSETEND:
  135.         end;
  136.      end;
  137.